[bits 32]

; 内核入口点 - 确保这是文件中的第一个定义

section .text
global _start
extern hide_cursor, clear_screen, print_str
extern shell
_start:
    ; 1. 设置显存段 (0x18 是GDT中显存段的选择子)
    mov ax, 0x18
    mov gs, ax
    
    ; 调试标记1: 内核入口点 (白色)
    mov byte [gs:0], '1'
    mov byte [gs:1], 0x0F
    
    ; 2. 设置堆栈指针 (重要!)
    mov esp, 0x90000
    
    ; 调试标记2: 堆栈设置完成 (白色)
    mov byte [gs:2], '2'
    mov byte [gs:3], 0x0F
    
    ; 3. 调用内核初始化函数
    call kernel_init
    
    ; 调试标记3: 内核初始化完成 (白色)
    mov byte [gs:4], '3'
    mov byte [gs:5], 0x0F
    
    ; 4. 启动shell (ebx=0 表示从屏幕顶部开始)
    xor ebx, ebx        ; 行号=0
    call shell
    
    ; 调试标记4: Shell启动 (白色)
    mov byte [gs:6], '4'
    mov byte [gs:7], 0x0F
    
    ; 5. 如果shell返回，挂起系统
    cli
    hlt

; 内核初始化函数
kernel_init:
    ; 保存寄存器
    pusha
    
    ; 初始化屏幕
    call hide_cursor
    call clear_screen
    
    ; 显示启动消息 (白色文字)
    mov ebx, 0          ; 行号=0
    mov ecx, 0          ; 列号=0
    mov esi, hello_msg  ; 字符串地址
    mov ah, 0x0F        ; 属性: 白色文字
    call print_str
    
    ; 恢复寄存器
    popa
    ret

; 数据段
section .data
hello_msg db "MoniOS Kernel Ready", 0

; 未初始化数据段
section .bss
; 文件系统缓冲区
sector_buf resb 512
bpb_buf    resb 512
fat_buf    resb 512

; 文件系统参数
part_start resd 1
fat_start  resd 1
root_start resd 1
data_start resd 1
root_sectors resd 1